package model.rentals;

import java.io.File;
import java.security.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Observable;

import model.EMedium;
import model.EMediumPropertiesData;
import model.EMediumType;

import model.lendables.Lendable;

/**
 * Classe Rental que representa um aluguer e mantem informacao sobre a que
 * Lendable se refere o aluguer, o instante em que foi feito, se ainda esta
 * em vigor ou se ja expirou e uma lista de anotacoes que o utilizador pode
 *  querer fazer associado ao media
 * @author DCO37
 * 	N.º 42484 Helder Ferreira
 *  N.º 45509 Luis Ferreira
 */
public class Rental extends Observable implements EMedium {

	private Lendable lendable ;
	private Date timeStamp;
	private Boolean expired;
	private List<String> annotations;


	/**
	 * Construtor de Rental um aluguer a partir do item(lendable)
	 * que se pretende alugar
	 * @param lendable - item a alugar
	 */
	public Rental(Lendable lendable) {
		this.lendable = lendable;
		this.timeStamp =null;
		// experied ver relacao com Date
		this.expired=false;
		this.annotations = new ArrayList<String>();
	}

	@Override
	/**
	 * Compara se dois item sao iguais
	 */
	public int compareTo(EMedium arg0) {
		return this.lendable.getFile().compareTo(arg0.getFile());
	}

	@Override
	/**
	 * Obtem o ficheiro do item
	 */
	public File getFile() {
		return this.lendable.getFile();
	}

	/**
	 * Obtem o titulo do item
	 */
	@Override
	public String getTitle() {
		return this.lendable.getTitle();
	}

	@Override
	/**
	 * Obtem o internet type do item
	 */
	public String getInternetType() {
		return this.lendable.getInternetType();
	}

	@Override
	/**
	 * Obtem o tipo do item
	 */
	public EMediumType getType() {
		return this.lendable.getType();
	}

	@Override
	/**
	 * Obtem as propriedades do item
	 */
	public EMediumPropertiesData getEMediumProperties() {
		return this.lendable.getEMediumProperties();
	}

	/**
	 * Devolve o instante em que foi alugado este item
	 * @return timeStamp
	 */
	public Date getRentalTimestamp(){
		return this.timeStamp;
	}

	/**
	 * Adiciona uma anotacao (global) ao media
	 * @param text - anotacao 
	 */
	public void addAnnotation(String text) {
		annotations.add(text);
		
	}

	/**
	 * Remove a n-esima anotacao do media
	 * @param n - n-esima anotacao do media
	 * @requires annotations != null && n existe
	 */
	public void removeAnnotation(int n){
		annotations.remove(n);
	}

	/**
	 * Devolve as anotacoes associadas ao media
	 * @return annotations
	 */
	public Iterable <String> getAnnotations(){
		return annotations;
	}

	/**
	 * Faz a renovacao de um aluguer
	 */
	public void renew(){
		this.timeStamp = new Date();
	}

	/**
	 * Verifica se este aluguer ainda esta em vigor. 
	 * Um aluguer expirado nao pode ser visualizado, mas devem ser
	 * preservadas as anotacoes feitas ao item.
	 * @return true caso tenha expirado o aluguer , ou false caso contrario
	 */
	public boolean isExpired (){
		// experied ver relacao com Date
		//verificar nao actualiza timestamp
		return expired;
	}
	
}
